package com.yungu.swift.assets.driver.service;

import com.yungu.swift.assets.driver.model.dto.*;
import com.yungu.swift.assets.driver.model.param.*;
import com.yungu.swift.assets.driver.model.vo.*;
import com.yungu.swift.base.ResponseData;
import com.yungu.swift.base.model.PageVo;
import com.yungu.swift.base.service.BaseService;

import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * Copyright © 厦门云谷互联信息有限公司 2018-2020 All Right Reserved
 * <p>
 * 司机业务逻辑接口
 *
 * @author Zerrion
 * @version 1.0.0-RELEASE
 * @since 2018-07-05 16:23
 */
public interface DriverService extends BaseService<DriverDto> {

    /**
     * 后台获取司机列表
     *
     * @param driverPageParam 参数
     * @return Map
     */
    ResponseData<PageVo<AdminDriverVo>> queryPageAdmin(AdminDriverPageParam driverPageParam);

    /**
     * 后台导出列表
     *
     * @param driverPageParam
     * @return
     */
    ResponseData<List<DriverExportVo>> exportAdmin(AdminDriverPageParam driverPageParam);

    /**
     * 后台-查询APP/区域代理/公司 下的司机总数
     *
     * @param appid       参数
     * @param agentUuid   参数
     * @param companyUuid 参数
     * @return int
     */
    ResponseData<Integer> getCountAdmin(String appid, String agentUuid, String companyUuid);

    /**
     * 后台-查询APP/区域代理/公司 下的订单总数
     *
     * @param appid       参数
     * @param agentUuid   参数
     * @param companyUuid 参数
     * @return int
     */
    ResponseData<Integer> getOrderCount(String appid, String agentUuid, String companyUuid);

    /**
     * 获取司机信息
     *
     * @param uuid 参数
     * @return DriverVo
     */
    ResponseData<DriverVo> selInfo(String uuid);

    /**
     * 获取司机详情
     *
     * @param paramsMap 参数
     * @return List
     */
    ResponseData<List<DriverDto>> listExtend(Map<String, Object> paramsMap);

    /**
     * 司机登陆
     *
     * @param driver    参数
     * @param driverLog 参数
     * @return AjaxList
     */
    ResponseData<DriverVo> login(DriverDto driver, DriverLogDto driverLog);


    /**
     * 获得可绑定车辆列表
     *
     * @param bindCarParam
     * @return
     */
    ResponseData<List<CarDto>> bindCarList(AdminDriverBindCarParam bindCarParam);

    /**
     * 司机绑定车辆
     *
     * @return ResponseData
     */
    ResponseData<Boolean> bindCar(AdminDriverBindCarParam bindCarParam);

    /**
     * 司机登出
     *
     * @param token      参数
     * @param appid      参数
     * @param offWorkLng 参数
     * @param offWorkLat 参数
     * @param uploadText 参数
     * @return AjaxList
     */
    ResponseData<Boolean> logout(String token, String appid, Double offWorkLng, Double offWorkLat, String uploadText);

    /**
     * 判断是否存在司机账号
     *
     * @param uuid  参数
     * @param token 参数
     * @return boolean
     */
    ResponseData<Boolean> isDriver(String uuid, String token);

    /**
     * 根据token从缓存中取数据，无则从数据库中获取
     *
     * @param token 参数
     * @return Map
     */
    ResponseData<Map<String, String>> getDriverCachedByToken(String token);

    /**
     * 司机上班
     *
     * @param uuid       参数
     * @param onWorkLng  参数
     * @param onWorkLat  参数
     * @param uploadText 参数
     * @return AjaxList
     */
    ResponseData<Boolean> onWork(String uuid, Double onWorkLng, Double onWorkLat, String uploadText);

    /**
     * 司机下班
     *
     * @param uuid       参数
     * @param offWorkLng 参数
     * @param offWorkLat 参数
     * @param uploadText 参数
     * @return AjaxList
     */
    ResponseData<Boolean> offWork(String uuid, Double offWorkLng, Double offWorkLat, String uploadText);

    /**
     * 根据车牌号查询已出车的司机
     *
     * @param carUuid 参数
     * @return List
     */
    ResponseData<List<DriverDto>> findWorkedDrivers(String carUuid);

    /**
     * 更改密码
     *
     * @param passWord 参数
     * @param uuid     参数
     * @return AjaxList
     */
    ResponseData<Boolean> resetPsw(String passWord, String uuid);

    /**
     * 根据旧密码的正确性来修改密码
     *
     * @param uuid   参数
     * @param oldPsw 参数
     * @param newPsw 参数
     * @return AjaxList
     */
    ResponseData<Boolean> resetByPsw(String uuid, String oldPsw, String newPsw);

    /**
     * 验证手机号码和身份证
     *
     * @param mobile 参数
     * @param idcard 参数
     * @param appid  参数
     * @param type   参数
     * @return AjaxList
     */
    ResponseData<Boolean> validate(String mobile, String idcard, String appid, Integer type);

    /**
     * 验证申请提现输入的登陆密码
     *
     * @param uuid     参数
     * @param password 参数
     * @return AjaxList
     */
    ResponseData<Boolean> verifyIdentidy(String uuid, String password);


    /**
     * 更新司机评分
     *
     * @param actualDriverUuid 参数
     * @param score            参数
     * @return
     */
    ResponseData<Boolean> updDriverScore(String actualDriverUuid, Double score);

    /**
     * 设置听单模式
     *
     * @param driverRemindParam
     * @return AjaxList
     */
    ResponseData<Boolean> updRemind(DriverRemindParam driverRemindParam);


    /**
     * 更新账号状态
     *
     * @param adminDriverAbortParam 解封/封号参数
     * @return AjaxList
     */
    ResponseData<Boolean> changeStatus(AdminDriverAbortParam adminDriverAbortParam);

    /**
     * 获取司机的uuid列表
     *
     * @param params 参数
     * @return List
     */
    ResponseData<List<String>> getDriverUuidList(Map<String, Object> params);

    /**
     * 获取司机信息（个人信息/星数统计/标签统计）
     *
     * @param driverUuid 参数
     * @return AjaxList
     */
    ResponseData<Map<String, Object>> getDriverInfo(String driverUuid);


    /**
     * 过滤可抢单司机
     *
     * @param carModelValuationUuid 参数
     * @param driverIdList          参数
     * @param isSelf                参数
     * @param seatNum               参数
     * @param originCityUuid        参数
     * @param isStationOrder        是否火车站订单
     * @return List
     */
    ResponseData<List<String>> filterGrabDriver(String carModelValuationUuid, List<String> driverIdList, boolean isSelf, Integer seatNum, String originCityUuid, boolean isStationOrder);


    /**
     * 获取同城司机 —— 用于推单
     *
     * @param appid
     * @param typeTrip
     * @param originCityUuid
     * @return
     */
    ResponseData<List<String>> getTheSameCityDriver(String appid, Integer typeTrip, String originCityUuid);

    /**
     * 过滤上班司机
     *
     * @param driverUuids 参数
     * @return List
     */
    ResponseData<List<String>> filterWorkUuid(List<String> driverUuids);

    /**
     * 获取可派单司机
     *
     * @param params 过滤参数
     * @return AjaxList
     * @author yunan
     * @date 2018/1/3
     */
    ResponseData<List<String>> filterAssignDriver(Map<String, Object> params);

    /**
     * 预约单过滤可推单司机
     *
     * @param carModelValuationUuid 参数
     * @param driverIdList          参数
     * @param departTime            参数
     * @param remindType            参数
     * @param seatNum               参数
     * @param originCityUuid        参数
     * @param isStationOrder        是否火车站订单
     * @return List
     */
    ResponseData<List<String>> filterGrabDriverReservation(String carModelValuationUuid, List<String> driverIdList,
                                                           Date departTime, Integer remindType, Integer seatNum,
                                                           String originCityUuid, boolean isStationOrder);

    /**
     * 检索司机公用方法
     *
     * @param map 参数
     * @return DriverVo
     */
    ResponseData<DriverVo> commonSelInfo(Map<String, Object> map);

    /**
     * 导入司机
     *
     * @param driverDtoList              参数
     * @param driverTrainDtoList         参数
     * @param updatingDriverDtoList      参数
     * @param updatingDriverTrainDtoList 参数
     * @return AjaxList
     */
    ResponseData<Boolean> importDriver(List<DriverDto> driverDtoList, List<DriverTrainDto> driverTrainDtoList, List<DriverDto> updatingDriverDtoList, List<DriverTrainDto> updatingDriverTrainDtoList);

    /**
     * 司机离职
     *
     * @param driverDimissParam 参数
     * @return AjaxList
     */
    ResponseData<Boolean> driverDimission(AdminDriverDismissParam driverDimissParam);


    /**
     * 检索有效司机（未离职）
     *
     * @param params 参数
     * @return AjaxList
     */
    ResponseData<List<DriverDto>> getValidDriver(Map<String, Object> params);

    /**
     * 记录司机离在线
     *
     * @param driverUuid 参数
     * @return AjaxList
     */
    ResponseData<Boolean> recordOnOrOffLine(String driverUuid, Long uploadDate);

    /**
     * 记录状态分割
     *
     * @return AjaxList
     */
    ResponseData<Boolean> statusSplit();

    /**
     * 根据电话或者身份证查询司机
     *
     * @param mobile 参数
     * @param idCard 参数
     * @return List
     */
    ResponseData<List<DriverDto>> findDriverByMobileOrId(String mobile, String idCard);


    void incrDriOrderCountByUuid(String uuid);

    /**
     * 根据司机的身份证号获取司机列表
     *
     * @param idCard
     * @return
     */
    ResponseData<DriverDto> getDriverByIdCard(String idCard);


    /**
     * 根据司机得到客服电话
     *
     * @param driverUuid  司机uuid
     * @param companyUuid 公司uuid
     * @return
     */
    ResponseData<String> getDriverServiceTel(String driverUuid, String companyUuid);

    /**
     * 根据司机得到跨城客服电话
     *
     * @param driverUuid  司机uuid
     * @param companyUuid 公司uuid
     * @return
     */
    ResponseData<String> getDriverJoinServiceTel(String driverUuid, String companyUuid);

    /**
     * 获取顺路模式司机
     *
     * @param businessType
     * @param driverUuids
     * @return
     */
    ResponseData<List<DriverSameWayInfoVo>> getSameWayDriverUuid(Integer businessType, List<String> driverUuids);

    /**
     * 关闭司机顺路模式
     *
     * @param businessType
     * @return
     */
    ResponseData<Boolean> closeDriverSameWayModel(String businessType);

    /**
     * 获取司机听单模式
     *
     * @param driverUuid
     * @return
     */
    ResponseData<DriverRemindTypeVo> getDriverRemindType(String driverUuid);

    /**
     * 获取司机开通城市或者区域
     *
     * @param driverUuid
     * @return
     */
    ResponseData<List<DriverManageInfoVo>> getManageInfo(String driverUuid);

    /**
     * 关闭不接火车站订单
     *
     * @param businessType
     * @return
     */
    ResponseData<Boolean> closeDriverStationModel(String businessType);

    /**
     * 司机解绑车辆
     *
     * @return ResponseData
     */
    ResponseData<Boolean> unBindCar(AdminDriverBindCarParam bindCarParam);

    /**
     * 获取司机佣金配置
     */
    ResponseData<DriverCommissionConfigDto> getDriverCommissionConfig(String driverUuid);

    /**
     * 保存司机佣金配置
     */
    ResponseData<Boolean> saveDriverCommissionConfig(DriverCommissionConfigDto driverCommissionConfigDto);

    /**
     * 获取扫码司机信息
     */
    ResponseData<ScanCodeDriverInfoVo> getScanCodeDriverInfo(String driverUuid);
}